import * as SQLite from 'expo-sqlite';
import {SQLiteDatabase} from "expo-sqlite";
import * as SecureStore from 'expo-secure-store';

const DB_INITIALIZED_KEY = "sqlite_initialized";
const DB_NAME = "telechat.db"

let db: SQLiteDatabase | null = null;
/**
 * 获取或初始化 SQLite 客户端
 * @returns {SQLiteDatabase} SQLite 客户端实例
 * @author FlanChan
 */
const getSqliteClient = (): SQLiteDatabase => {
    if (db) {
        return db;
    }

    db = SQLite.openDatabaseSync(DB_NAME)
    initializeDatabases(db)
    return db;
}

/**
 * 初始化数据库
 * @param db SQLiteDatabase
 */
function initializeDatabases(db: SQLiteDatabase): void {
    const initializedKey = SecureStore.getItem(DB_INITIALIZED_KEY)
    if (initializedKey) {
        return;
    }
    // 初始化数据表
    const ddl = `
        CREATE TABLE IF NOT EXISTS chat_message (
              id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键: 消息ID
              message_id TEXT NOT NULL , -- 消息唯一ID
              owner_id TEXT NOT NULL, -- 所属用户ID
              user_id TEXT NOT NULL, -- 发送者用户ID
              session_id TEXT NOT NULL, -- 会话ID
              message_type INTEGER NOT NULL, -- 消息类型
              content TEXT NOT NULL, -- 消息内容（JSON字符串）
              system BOOLEAN DEFAULT 0 NOT NULL, -- 是否系统消息 0否 1是
              status INTEGER DEFAULT 0 NOT NULL, -- 发送状态 0发送中 1已发送 2发送失败
              revoke_status BOOLEAN DEFAULT 0 NOT NULL, -- 撤回状态 0未撤回 1已撤回
              reply_id TEXT, -- 被回复的消息ID 
              reply_user_name TEXT, -- 被回复的发送者名称
              reply_content TEXT, -- 被回复的消息负载json字符串
              reply_message_type INTEGER, -- 被回复的消息的消息类型
              reply_revoke_status BOOLEAN DEFAULT 0, -- 被回复的消息的撤回状态 0未撤回 1已撤回
              create_time INTEGER NOT NULL -- 发送时间
        ); -- 消息表
  
        CREATE TABLE IF NOT EXISTS chat_session (
              id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键ID 避免本地会话重复
              owner_id TEXT NOT NULL, -- 所属用户ID
              session_id TEXT NOT NULL, -- 会话ID（群聊时为群ID）
              session_type INTEGER NOT NULL, -- 会话类型 0单聊 1群聊
              last_message_id TEXT, -- 最后一条消息ID
              last_message TEXT, -- 最后一条消息内容
              unread_count INTEGER DEFAULT 0, -- 未读消息数
              notice BOOLEAN DEFAULT 1, -- 是否开启消息通知 0否 1是
              pined BOOLEAN DEFAULT 0, -- 是否置顶 0否 1是
              draft TEXT, -- 草稿内容   
              disturb BOOLEAN DEFAULT 0,  -- 是否免打扰 0否 1是
              update_time INTEGER -- 本地更新时间
        ); -- 会话表
    
        CREATE TABLE IF NOT EXISTS group_info (
              id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键ID
              owner_id TEXT NOT NULL, -- 所属用户ID
              group_id TEXT NOT NULL UNIQUE, -- 群聊ID (可关联会话信息表)
              group_name TEXT NOT NULL, -- 群聊名称
              group_avatar TEXT, -- 群聊头像（优先采用本地）
              member_count INTEGER DEFAULT 0, -- 群成员数量
              description TEXT, -- 群介绍
              notice      TEXT, -- 群通知
              noticed     BOOLEAN DEFAULT 0, -- 是否已通知
              create_time TEXT NOT NULL, -- 创建时间
              update_time TEXT NOT NULL -- 更新时间
        ); -- 群聊信息表
    
        CREATE TABLE IF NOT EXISTS chat_user (
              id TEXT PRIMARY KEY, -- 主键ID
              name TEXT NOT NULL, -- 昵称
              avatar TEXT, -- 头像地址（建议使用本地）
              update_time INTEGER NOT NULL -- 更新时间
        ); -- 用户信息表
        
        CREATE TABLE IF NOT EXISTS file_cache (
            id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键ID
            file_path TEXT NOT NULL, -- 文件本地路径
            server_url TEXT, -- 文件服务端地址
            file_md5 TEXT NOT NULL UNIQUE, -- 文件MD5，用于去重
            file_type INTEGER NOT NULL, -- 文件类型（如 image、file 等）
            file_size INTEGER NOT NULL, -- 文件大小（字节）
            optional  TEXT , -- 文件额外信息
            create_time INTEGER NOT NULL -- 缓存时间
        ); -- 文件缓存表
    
        CREATE TABLE IF NOT EXISTS user_emoji_package (
            id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键ID
            owner_id TEXT NOT NULL, -- 用户ID
            create_time INTEGER NOT NULL, -- 创建时间
            update_time INTEGER NOT NULL -- 更新时间
        ); -- 用户表情包表
    
    
        CREATE TABLE IF NOT EXISTS user_emoji_package_item_cache (
            id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主键ID
            emoji_pack_item_id TEXT NOT NULL, -- 表情包项ID
            owner_id TEXT NOT NULL, -- 用户ID
            file_path TEXT NOT NULL, -- 文件本地路径
            server_url TEXT NOT NULL, -- 文件服务端地址
            server_file_id TEXT NOT NULL, -- 服务端文件ID
            sort_order INTEGER DEFAULT 0, -- 排序
            create_time INTEGER NOT NULL, -- 缓存时间
            update_time INTEGER NOT NULL -- 更新时间
        );
    `;
    // 执行DDL语句
    db.execSync(ddl)
    console.log("SQLite 数据库已初始化");
    // 标记数据库已初始化
    SecureStore.setItem(DB_INITIALIZED_KEY, "1")
}

export default getSqliteClient;